package com.qen.common;

import com.qen.conditions.query.LambdaQueryChainWrapper;
import com.qen.conditions.query.QueryChainWrapper;
import com.qen.conditions.update.LambdaUpdateChainWrapper;
import com.qen.conditions.update.UpdateChainWrapper;
import com.qen.repository.BaseDao;

/**
 * @author licz
 * @data 2025年05月26日 10:18 AM
 */
public final class ChainWrappers {

    private ChainWrappers() {
        // ignore
    }

    /**
     * 链式查询 普通
     *
     * @return QueryWrapper 的包装类
     */
    public static <T> QueryChainWrapper<T> queryChain(BaseDao<T> dao) {
        return new QueryChainWrapper<>(dao);
    }

    public static <T> QueryChainWrapper<T> queryChain(Class<T> entityClass) {
        return new QueryChainWrapper<>(entityClass);
    }

    /**
     * 链式查询 lambda 式
     * <p>注意：不支持 Kotlin </p>
     *
     * @return LambdaQueryWrapper 的包装类
     */
    public static <T> LambdaQueryChainWrapper<T> lambdaQueryChain(BaseDao<T> dao) {
        return new LambdaQueryChainWrapper<>(dao);
    }

    public static <T> LambdaQueryChainWrapper<T> lambdaQueryChain(Class<T> entityClass) {
        return new LambdaQueryChainWrapper<>(entityClass);
    }

    /**
     * 链式查询 lambda 式
     * <p>注意：不支持 Kotlin </p>
     *
     * @return LambdaQueryWrapper 的包装类
     */
    public static <T> LambdaQueryChainWrapper<T> lambdaQueryChain(BaseDao<T> dao, T entity) {
        return new LambdaQueryChainWrapper<>(dao, entity);
    }

    /**
     * 链式查询 lambda 式
     * <p>注意：不支持 Kotlin </p>
     *
     * @return LambdaQueryWrapper 的包装类
     */
    public static <T> LambdaQueryChainWrapper<T> lambdaQueryChain(BaseDao<T> dao, Class<T> entityClass) {
        return new LambdaQueryChainWrapper<>(dao, entityClass);
    }

    /**
     * 链式更改 普通
     *
     * @return UpdateWrapper 的包装类
     */
    public static <T> UpdateChainWrapper<T> updateChain(BaseDao<T> dao) {
        return new UpdateChainWrapper<>(dao);
    }

    public static <T> UpdateChainWrapper<T> updateChain(Class<T> entityClass) {
        return new UpdateChainWrapper<>(entityClass);
    }

    /**
     * 链式更改 lambda 式
     * <p>注意：不支持 Kotlin </p>
     *
     * @return LambdaUpdateWrapper 的包装类
     */
    public static <T> LambdaUpdateChainWrapper<T> lambdaUpdateChain(BaseDao<T> dao) {
        return new LambdaUpdateChainWrapper<>(dao);
    }

    public static <T> LambdaUpdateChainWrapper<T> lambdaUpdateChain(Class<T> entityClass) {
        return new LambdaUpdateChainWrapper<>(entityClass);
    }

}
